package com.ainiyar.springweb.util;

import com.ainiyar.springweb.pojo.entity.Menu;
import com.ainiyar.springweb.pojo.admin.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**************************************
 * File Name : MenuTreeUtils
 * Created with : IntelliJ IDEA.
 * Author : 艾尼亚尔·毛拉吾提
 * QQ : 524155792  WeChat : ainiyar0124
 * Created Time : 2024/2/5  01:19
 * Desc :
 ***************************************/
public class MenuTreeUtils {
    /**
     * 生成路由
     *
     * @param menuList 菜单列表
     * @param pid      父级菜单id
     * @return RouterVo
     */
    public static List<RouterVo> makeRouter(List<Menu> menuList, Long pid) {
        //创建集合保存路由信息
        List<RouterVo> routerVoList = new ArrayList<RouterVo>();
        //判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Menu>())
                //筛选不为空的菜单及菜单父级id相同的数据
                .stream().filter(item -> item != null && Objects.equals(item.getParentId(), pid))
                .forEach(item -> {
                    //创建路由对象
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName());//路由名称
                    //判断当前菜单是否一级菜单
                    if (item.getParentId() == 0) {
                        routerVo.setPath("/" + item.getName());//路由地址
                        routerVo.setComponent("Layout");//这是一级菜单组件（目录）
                    } else {
                        if (item.getELink() == 1) {
                            routerVo.setPath(item.getName());//路由地址
                            routerVo.setComponent("IFrame");
                        } else {
                            routerVo.setPath(item.getName());//路由地址
                            routerVo.setComponent(item.getUrl());//具体某一个组件
                        }
                    }
                    //外链接地址
                    String href = item.getELink() == 1 ? item.getUrl() : null;
                    //设置mete信息
                    routerVo.setMeta(new RouterVo.Meta(item.getLabel(), item.getIcon(), item.getHideMenu(), href));
                    //递归生成我们的路由
                    List<RouterVo> children = makeRouter(menuList, item.getId());
                    routerVo.setChildren(children);//设置子路由到路由对象中
                    routerVoList.add(routerVo);
                });
        //返回路由数据
        return routerVoList;
    }

    /**
     * 生成菜单树
     *
     * @param menuList 菜单数据
     * @param pid      父级ID
     * @return PermissionEntity
     */
    public static List<Menu> makeMenuTree(List<Menu> menuList, Long pid) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //创建集合保存菜单信息
        List<Menu> permissionList = new ArrayList<>();
        //判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Menu>())
                //筛选不为空的菜单及菜单父级id相同的数据
                .stream().filter(item -> item != null && Objects.equals(item.getParentId(), pid))
                .forEach(item -> {
                    //创建权限菜单对象
                    Menu permission = new Menu();
                    //将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item, permission);
                    permission.setCreate_time(item.getCreateTime().format(formatter));
                    if (item.getUpdateTime() != null) {
                        permission.setUpdate_time(item.getUpdateTime().format(formatter));
                    }
                    //获取每一个item对象的子菜单，递归生成菜单树
                    List<Menu> children = makeMenuTree(menuList, item.getId());
                    //设置子菜单
                    permission.setChildren(children);
                    //将菜单对象添加到集合
                    permissionList.add(permission);
                });
        //返回菜单数据
        return permissionList;
    }
}

